#include <stdlib.h>
#include <stdio.h>
#include "cra.h"

struct sCra
{
	int numV;
	int numA;
	int ariPorComer;
	Arista elem;
	Bool arr;
	char graphName;
};

cintrar
cra_create(void)
{
	cintrar cra;
	
	cra = (cintrar) malloc (sizeof(struct sCra));
	if (cra != NULL)
	{
		cra->arr = FALSE;
		cra->elem = NULL;
	}
	else
	{
		perror("No hay memoria para nueva cinta de lectura (cra_create)");
		exit(EXIT_FAILURE);
	}
return cra;
}

void
cra_arr(cintrar cra)
{
	int nv,na;
	size_t n;
	char * line = NULL;

	if (cra != NULL)
	{
		getline(&line, &n, stdin); /*como la primer linea con los nros de vertices y aristas */
		sscanf(line, "# %d %d", &nv, &na); 
		cra->numV = nv;
		cra->numA = na;
		cra->ariPorComer = na;
		cra->arr = TRUE;
		getline(&line, &n, stdin);/* como la segunda linea, con el nombre del grafo */
		sscanf(line, "graph %c{", &(cra->graphName));
		free(line);
		line = NULL;
		cra_av(cra);
	}
	else
		printf("Warn: Se intento arrancar una cinta nula. La cinta sigue nula\n");
}

void
cra_av(cintrar cra)
{
	size_t n;
	Nodo n1, n2;
	int w;
	char * line = NULL;

	if (cra->arr && !cra_fin(cra))
	{
		if (cra->elem != NULL)
			cra->elem = arista_destroy(cra->elem);

		getline(&line, &n, stdin);
		sscanf(line, "%d -- %d [label=%d];", &n1, &n2, &w);
		cra->elem = arista_create(n1,n2,w);
		free(line);
		line = NULL;
		cra->ariPorComer -= 1;
	}
	else
		printf("Warn: Se intento avanzar en una cinta no arrancada o terminada\n");
}

Arista
cra_elec(const cintrar cra)
{
	Arista a;
	if (cra->arr && !cra_fin(cra))
		a = arista_clone (cra->elem);
	else
	{
		perror("Intentando obtener la arista corriente de una cinta terminada o no arrancada");
		exit(EXIT_FAILURE);
	}
return a;
}

Bool
cra_fin(const cintrar cra)
{
	Bool b;
	b = (cra->ariPorComer == -1); /* si pongo cero queda sin leer la ultima arista */
return b;
}		

int
cra_cantvert(const cintrar cra)
{
	int nv;
	nv = cra->numV;
return nv;
}

int
cra_cantaris(const cintrar cra)
{
	int na;
	na = cra->numA;
return na;
}

cintrar
cra_destroy(cintrar cra)
{
	if (cra->elem != NULL)
		cra->elem = arista_destroy(cra->elem);
	
	if (cra!=NULL)
	{
		free(cra);
		cra = NULL;
	}
return cra;
}
